#include <conio.h>
#include <graphics.h>
#include<stdio.h>

#define high 600 // 游戏画面尺寸
#define width 350
#pragma comment(lib,"Winmm.lib")
//障碍物宽度140，高度600
//小鸟宽度32 ，高度24
//全局变量
IMAGE imgbk,imgbd1,imgbd2,imgbarup1,imgbarup2,imgbardown1,imgbardown2;
int birdx;
int birdy;
int barx1;           //定义第一个障碍物
int baryup1;
int barydown1;
int barx2;          //定义第二个障碍物
int baryup2;
int barydown2;
int score;       //得分

void gameover();

void startup()  // 数据初始化
{
	mciSendString("open F:\\background.mp3 alias bkmusic",NULL,0,NULL);//背景音乐
	mciSendString("play bkmusic repeat",NULL,0,NULL);//循环播放
	initgraph(width, high);
	loadimage(&imgbk,"F:\\background.jpg");
	loadimage(&imgbd1,"F:\\bird1.jpg");
	loadimage(&imgbd2,"F:\\bird2.jpg");
	loadimage(&imgbarup1,"F:\\bar_up1.gif");
	loadimage(&imgbarup2,"F:\\bar_up2.gif");
	loadimage(&imgbardown1,"F:\\bar_down1.gif");
	loadimage(&imgbardown2,"F:\\bar_down2.gif");
	birdx=50;
	birdy=200;
	barx1=150;
	baryup1=300;
	barydown1=200;
	barx2=400;
	baryup2=100;
	barydown2=350;
	score=0;
	BeginBatchDraw();
}


void show()  // 显示画面
{
	putimage(0,0,&imgbk);//显示背景
	putimage(barx1,baryup1-600,&imgbarup1,NOTSRCERASE);//显示上一半第一个障碍物
	putimage(barx1,baryup1-600,&imgbarup2,SRCINVERT);
	putimage(barx1,600-barydown1,&imgbardown1,NOTSRCERASE);//显示下一半第一个障碍物
	putimage(barx1,600-barydown1,&imgbardown2,SRCINVERT);
	putimage(barx2,baryup2-600,&imgbarup1,NOTSRCERASE);//显示上一半第二个障碍物
	putimage(barx2,baryup2-600,&imgbarup2,SRCINVERT);
	putimage(barx2,600-barydown2,&imgbardown1,NOTSRCERASE);//显示下一半第二个障碍物
	putimage(barx2,600-barydown2,&imgbardown2,SRCINVERT);
	putimage(birdx,birdy,&imgbd1,NOTSRCERASE);//显示小鸟
	putimage(birdx,birdy,&imgbd2,SRCINVERT);
	
	LOGFONT f;
	gettextstyle(&f);                     // 获取当前字体设置
	f.lfHeight = 48;                      // 设置字体高度为 48
	_tcscpy(f.lfFaceName, _T("黑体"));    // 设置字体为“黑体”
	f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
	settextstyle(&f);                     // 设置字体样式
	char s[5];
	sprintf(s, "%d", score);
	outtextxy(10, 60, s);
	setbkmode(TRANSPARENT);
	FlushBatchDraw();
	// 延时
	Sleep(50);	
}	

void updateWithoutInput()  // 与用户输入无关的更新
{
	if(birdy<576){
		birdy=birdy+3;
	}
	if(barx1>=-140){
		barx1--;
	}
	if(barx2>=-140){
		barx2--;
	}
	if(barx1==-140){       //障碍物重新生成
		barx1=rand()%(width-140);
		if(barx1<=birdx+50){
			barx1=barx1+50;
		}
		if(barx1<=barx2+200){
			barx1=barx1+200;
		}
		if(barx1>=width){
			barx1=width;
		}
		while(1){
			baryup1=rand()%(high-150);
			barydown1=rand()%(high-150);
			if((600-baryup1-barydown1)<=120&&(600-baryup1-barydown1)>=65){
				break;
			}
		}
		
	}
	if(barx2==-140){       
		barx2=rand()%(width-140);
		if(barx2<=birdx+50){
			barx2=barx2+50;
		}
		if(barx2<=barx1+200){
			barx2=barx2+200;
		}
		if(barx2>=width){
			barx2=width;
		}
		while(1){
			baryup2=rand()%(high-150);
			barydown2=rand()%(high-150);
			if((600-baryup2-barydown2)<=120&&(600-baryup2-barydown2)>=65){
				break;
			}
		}
	}
	//加分机制
	if(birdx==barx1+141||birdx==barx2+141){
		score++;
	}
    //死亡机制
	if(birdy<=23||birdy>=577){
		LOGFONT f;
		gettextstyle(&f);                     // 获取当前字体设置
		f.lfHeight = 48;                      // 设置字体高度为 48
		_tcscpy(f.lfFaceName, _T("黑体"));    // 设置字体为“黑体”
		f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
		settextstyle(&f);                     // 设置字体样式
		settextcolor(RED);                    //颜色
		outtextxy(width/4,high/2, _T("你失败了"));
		setbkmode(TRANSPARENT);
		gameover();
	}
	if((birdx+32>=barx1&&birdx<=barx1+140&&(birdy<=baryup1||birdy+23>=(600-barydown1)))||(birdx+32>=barx2&&birdx<=barx2+140&&(birdy<=baryup2||birdy+23>=(600-barydown2)))){
		LOGFONT f;
		gettextstyle(&f);                     // 获取当前字体设置
		f.lfHeight = 48;                      // 设置字体高度为 48
		_tcscpy(f.lfFaceName, _T("黑体"));    // 设置字体为“黑体”
		f.lfQuality = ANTIALIASED_QUALITY;    // 设置输出效果为抗锯齿  
		settextstyle(&f);                     // 设置字体样式
		settextcolor(RED);                    //颜色
		outtextxy(width/4,high/2, _T("你失败了"));
		setbkmode(TRANSPARENT);
		gameover();
	}
}
void updateWithInput()  // 与用户输入有关的更新
{	
	char input;
	if(kbhit()){
		input=getch();
		if(input==' '&&birdy>24){
			mciSendString("close jpmusic",NULL,0,NULL);  //关闭前一次音乐
			mciSendString("open F:\\Jump.mp3 alias jpmusic",NULL,0,NULL);//播放音乐
			mciSendString("play jpmusic",NULL,0,NULL);//仅播放一次
			birdy=birdy-20;
		}
	}
}

void gameover()
{
	
	EndBatchDraw();
	getch();
	closegraph();
}

int main()
{
	startup();  // 数据初始化	
	while (1)  //  游戏循环执行
	{
		updateWithoutInput();  // 与用户输入无关的更新
		updateWithInput();     // 与用户输入有关的更新
		show();  // 显示新画面
	}
	gameover();     // 游戏结束、后续处理
	return 0;
}